#

| Chapter 31 Creating Custom Commands in vi |

## 31.7 Maps for Repeated Edits

[Another way to do this is with `@`-functions (31.4). -JP]

Not every keymap is something you want to save in your .exrc file. Some maps are handy just because you have to do a repetitive series of edits. Developing a complex map to repeat your edits can save more time than it takes. For example, assume that you have a glossary with entries like this:

>     map - an ex command which allows you to associate
>     a complex command sequence with a single key.

You want to convert this glossary list to nroff (43.13) format, so that it looks like:

>     .IP "map" 10n
>     An ex command which allows you to associate
>     a complex command sequence with a single key.

The best way to define a complex map is to do the edit once manually, writing down each keystroke that you must type. Then re-create these keystrokes as a map. You want to:

1. Insert the ms macro for an indented paragraph (`.IP`) at the beginning of the line. Insert the first quotation mark as well (`I.IP <">`).

2. Press ESC to terminate text-input mode.

3. Move to the end of the first word (`e`) and add a second quotation mark, followed by a space and the size of the indent (`a<"> 10n`).

4. Press RETURN to insert a new line.

5. Press ESC to terminate text-input mode.

6. Remove the hyphen and two surrounding spaces (`3x`) and capitalize the next word (`~`).

That's quite an editing chore if you have to repeat it more than a few times. With `map` you can save the entire sequence so that it can be re-executed with a single keystroke:

>     map g I.IP "^[ea" 10n^M^[3x~

(To set that option during a vi session, type a colon (`:`) first.) Note that you have to "quote" both the ESC and RETURN characters with CTRL-v (31.6). `^[` is the sequence that appears when you type `[CTRL-v]` followed by `[ESC]` `^M` is the sequence shown when you type `[CTRL-v]` `[RETURN]`.

Now, simply typing `g` will perform the entire series of edits. At a slow data rate you can actually see the edits happening individually. At a fast data rate it will seem to happen by magic.

Don't be discouraged if your first attempt at keymapping fails. A small error in defining the map can give very different results from the ones you expect. Type `u` to undo the edit, and try again.

[I like to write a keymap in a temporary file and edit it there until I get it right. For instance, I write my buffer and type `:e temp.so` to open the temporary file temp.so. I make the keymaps, one per line - without a colon (`:`) first. I write this map file (`:w`), then read it in to the editor (`:so % (30.4)`). If I don't get an error, I switch to the original file (`:e # (30.4)`) and try the map. Then I usually go back to the map file (`:e#`) again, fix the mistake `:-)`, and repeat the process until I get what I wanted. -JP ]

- TOR from O'Reilly & Associates' Learning the vi Editor, Chapter 7

31.6 Protecting Keys from Interpretation by ex |  | 31.8 More Examples of Mapping Keys in vi